#!/bin/dash
set -e

# $1: dfile, $2: link target, $3: distrib
replace_with_link() {
	dfile=$1; ltarget=$2; distrib=$3
	temp=$dfile.tmp
	# Safely create a symlink to $ltarget at $dfile, first
	# making a backup of $dfile (the file being diverted)
	# in $distrib (if specified).
	#
	# The cp / ln -s / mv dance avoids having to live without
	# $dfile (think: /bin/sh) for even a moment, so applications
	# running in parallel can continue without trouble.
	# See dash.preinst for details.
	if [ -n "$distrib" ] && [ -e "$dfile" ]; then
		cp -dp "$dfile" "$distrib"
	fi
	ln -sf "$ltarget" "$temp"
	mv -f "$temp" "$dfile"
}

claim_binsh() {
	dfile=$1 ltarget=$2 distrib=${3:-$dfile.distrib}
	diverter=$(dpkg-divert --listpackage $dfile)
	truename=$(dpkg-divert --truename $dfile)

	if [ "$diverter" = dash ]; then
		# good.
		return
	fi

	if [ "$diverter" = LOCAL ]; then
		# The sysadmin wants it this way.  Who am I to argue?
		return
	fi

	if [ -n "$diverter" ] && [ "$diverter" != bash ]; then
		# Let dpkg-divert error out; we are not taking
		# over the diversion, unless we added it
		# ourselves on behalf of bash.
		dpkg-divert --package dash --no-rename --remove $dfile
		echo "This should never be reached"
		exit 1
	fi

	dpkg-divert --package bash --no-rename --remove $dfile
	dpkg-divert --package dash --no-rename --divert $distrib --add $dfile
	# remove the old equivalent of $distrib, if it existed.
	if [ -n "$truename" ]; then
	       rm -f "$truename"
	fi
	replace_with_link $dfile $ltarget $distrib
}

unclaim_binsh() {
	dfile=$1 ltarget=$2 distrib=${3:-$dfile.distrib}
	diverter=$(dpkg-divert --listpackage $dfile)
	truename=$(dpkg-divert --truename $dfile)

	if [ "$diverter" != dash ]; then
		# good.
		return
	fi

	# Donate the diversion and sh symlink to the bash package.
	ltarget=$(echo $ltarget | sed s/dash/bash/)
	dpkg-divert --package dash --no-rename --remove $dfile
	dpkg-divert --package bash --no-rename --divert $distrib --add $dfile
	if [ -n "$truename" ]; then
		rm -f "$truename"
	fi
	replace_with_link $dfile $ltarget $distrib
}

initial_binsh_setup() {
	dfile=$1 ltarget=$2 distrib=${3:-$dfile.distrib} ashfile=$4
	diverter=$(dpkg-divert --listpackage $dfile)
	truename=$(dpkg-divert --truename $dfile)

	if [ -z "$diverter" ]; then
		# good.
		return
	fi

	if [ "$diverter" = ash ]; then
		dpkg-divert --package ash --no-rename --remove $dfile
		dpkg-divert --package dash --no-rename --divert $distrib --add $dfile

		if [ "$truename" != "$distrib" ] && [ -e "$truename" ]; then
			mv "$truename" "$distrib"
		fi
		replace_with_link $dfile $ltarget
		return
	fi

	if
		[ -h $dfile ] &&
		[ -f $dfile ] &&
		[ -f $ashfile ] &&
		cmp $dfile $ashfile
	then
		replace_with_link $dfile $ltarget
	fi
}

add_shell() {
	if ! type add-shell > /dev/null 2>&1; then
		return
	fi

	add-shell /bin/dash
}

debconf=
if [ -f /usr/share/debconf/confmodule ]; then
	. /usr/share/debconf/confmodule
	debconf=yes
fi

if [ "$1" = configure ] && [ -z "$2" ]; then
	initial_binsh_setup /bin/sh dash '' /bin/ash
	initial_binsh_setup /usr/share/man/man1/sh.1.gz dash.1.gz \
		/usr/share/man/man1/sh.distrib.1.gz \
		/usr/share/man/man1/ash.1.gz
	add_shell
elif [ "$1" = configure ] && dpkg --compare-versions "$2" lt 0.4.18; then
	add_shell
fi

if [ $debconf ]; then
	db_get dash/sh
	if [ "$RET" = true ]; then
		claim_binsh /bin/sh dash
		claim_binsh /usr/share/man/man1/sh.1.gz dash.1.gz \
			/usr/share/man/man1/sh.distrib.1.gz
	else
		unclaim_binsh /bin/sh dash
		unclaim_binsh /usr/share/man/man1/sh.1.gz dash.1.gz \
			/usr/share/man/man1/sh.distrib.1.gz
	fi
fi

# Automatically added by dh_installmenu/12.1.1ubuntu1
if [ "$1" = "configure" ] && [ -x "`which update-menus 2>/dev/null`" ]; then
	update-menus
fi
# End automatically added section

